#include <iostream>
#include <random>
#include <string>
#include <sstream>
#include <atomic>
#include <iomanip>

std::string uuid()
{
    std::stringstream ss;
    // 1. 构造一个机器随机数对象
    std::random_device rd;
    // 2. 以机器随机数为种子构造随机数对象
    std::mt19937 generator(rd());
    // 3. 构造限定数据范围的对象
    std::uniform_int_distribution<int> distribute(0,255);
    // 4. 生成8个随机数，按照特定格式组织成16进制的数字字符的数字字符串
    for (int i = 0; i < 8; i++) {
        if(i== 4 || i == 6) ss << "-";
        ss << std::setw(2) << std::setfill('0') << std::hex 
        <<  distribute(generator);
    }
    ss << "-";

    // 5. 定义一个8字节序号，逐字节组织成16进制数字字符的字符串
    static std::atomic<size_t> seq(1);
    size_t cur = seq.fetch_add(1);
    for (int i = 7; i >= 0; i--) {
        ss << std::setw(2) <<std::setfill('0') << std::hex  
        << ((cur >> i * 8) &0xff); 
    }

    return ss.str();
}

int main()
{
    for(int i = 0; i < 10; i++){
        std::cout << uuid() <<std::endl;
    }
    return 0;
}